package gops

import (
	"time"
)

// CronForegroundExecuteWithInterval 执行函数，并每隔 duration 执行一次,阻塞主进程执行
func CronForegroundExecuteWithInterval(execution func(), duration time.Duration) {
	t := time.NewTicker(duration) // 定时器
	//defer t.Stop()  // 主协程退出时停止定时器,暂时注释掉了,有问题
	execution() // 立即执行,第一次立即执行一次，然后每隔duration 执行一次
	for {
		select {
		case <-t.C:
			execution()
		}
	}
}

// CronBackgroundExecuteWithInterval 启动后台执行函数，每隔 duration 执行一次，并在后台独立运行，不阻塞主进程
func CronBackgroundExecuteWithInterval(execution func(), duration time.Duration, done <-chan struct{}) {
	// 以下是 done <-chan struct{} 的具体用法说明：
	//主协程通过 close(done) 通知退出。
	//其他协程通过 select 语句监听 done 通道，当通道被关闭时自动触发退出逻辑。
	ticker := time.NewTicker(duration) // 定时器
	//defer ticker.Stop() // 在函数退出时停止定时器

	// 立即执行一次
	execution()

	// 启动后台协程，进行定时执行
	go func() {
		for {
			select {
			case <-ticker.C:
				// 定时器触发，执行指定函数
				execution()
			case <-done:
				// 如果 done 通道关闭，则退出协程
				return
			}
		}
	}()
}

//func main() {
//    // 前台执行
//    CronForegroundExecuteWithInterval(func() { fmt.Println("hello world") }, 5*time.Second)
//
//    // 后台执行
//    // 创建 done 通道，用于控制后台协程停止
//    done := make(chan struct{})
//    // 定义一个执行函数
//    execution := func() {
//        // 定期执行的操作
//        fmt.Println("执行函数执行了")
//    }
//    // 启动后台任务，每2秒执行一次
//    CronBackgroundExecuteWithInterval(execution, 2*time.Second, done)
//
//    // 主线程
//    fmt.Println("main thread")
//    // 模拟主程序运行 10 秒后关闭后台任务
//    time.Sleep(10 * time.Second)
//    close(done)
//}
